<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
</body>
<script type="text/javascript">
(function(){
	alert("03_闭包.html");
})();
/**
闭包的构成有两种:
一: 运行对象直接返回一个function()方法,
相当于方法直接运行但是返回的function持有这次运行方法的引用,
而返回的function也被一个变量应用,因此运行的对象无法释放

二: new一个对象,此时对象也会被运行一遍,虽然没有返回值但是对象
本身被引用,也无法释放.

三: 有return的对象若是被new,实际上也是运行对象并返回.对象的各种方法均不可用

四: 奇怪的this:运行B1返回方法thsi对象代表的是B1,new B1()返回方法的this代表方法自己.
**/

function B1(_x) {
	this.x = _x; //相当于public static 成员变量
	var x1 = _x;
	
	return function(){
		alert("B1 this.x : "+this.x);
		alert("B1 x1 : "+x1);
	}
	
}

var d1 = B1(5);
d1();

//var d1 = new B1(4);
//d1();


function B2(_x) {
	this.x = _x; //相当于public static 成员变量
	var x1 = _x;
	this.alert = function(){
		alert("B2 this.x : "+this.x);
		alert("B2 x1 : "+x1);
	}
	
}
var d2 = new B2(6);
d2.alert();
//alert("B2 d2.alert2 : " +d2.alert2);

function B3(_x) {
	this.x = _x; //相当于public 成员变量
	var x1 = _x;
	return function(){};
}

var d3 = B3();
alert("d3 : "+d3);
alert("d3.x : "+d3.x);


var d4 = new B3(5);
alert("d4 : "+d4)
alert("d4.x : "+d4.x);

</script>
</html>